/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.di0.sql.insert;

import br.di0.sql.ConexaoPostgres;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;

/**
 *
 * @author di0
 */
public class InsertPerson {

    public InsertPerson(int tipoPerson) {
        this.tipoPerson = tipoPerson;
    }

    public int inserir(String[] person) {
        String user = "1";

        //(id_fornecedor/id_cliente), 1-nome, 2-tipo_cgc, 3-cgc, 4-instricao_estadual, 5-endereço, 6-cep, 7-cidade, 8-uf, telefone, telefone2, dat_inc, dat_alt, id_usuario
        String forn = "INSERT INTO fornecedor VALUES (DEFAULT," +
                "\'" + person[1] + "\', " + person[2] + "," +
                "\'" + person[3] + "\',\'" + person[4] + "\'," +
                "\'" + person[5] + "\',\'" + person[6] + "\'," +
                "\'" + person[7] + "\',\'" + person[8] + "\'," +
                "\'" + person[9] + "\',\'" + person[10] + "\'," +
                "(SELECT current_timestamp), (SELECT current_timestamp)," +
                user + ")";

        String cli = "INSERT INTO cliente VALUES (DEFAULT," +
                "\'" + person[1] + "\', " + person[2] + "," +
                "\'" + person[3] + "\',\'" + person[4] + "\'," +
                "\'" + person[5] + "\',\'" + person[6] + "\'," +
                "\'" + person[7] + "\',\'" + person[8] + "\'," +
                "\'" + person[9] + "\',\'" + person[10] + "\'," +
                "(SELECT current_timestamp), (SELECT current_timestamp)," +
                user + ")";

        String query = null;
        if (tipoPerson == CLIENTE) {
            System.out.println("Cliente selected");
            query = cli;
        } else if (tipoPerson == FORNECEDOR) {
            System.out.println("Fornecedor selected");
            query = forn;
        }

        int rs = 0;

        ConexaoPostgres postgres = new ConexaoPostgres();
        try {
            Connection conexao = postgres.setConexao();
            Statement stm = conexao.createStatement();

            int userOK = validarUsuario(user, stm);

            if (userOK == 0) {
                rs = stm.executeUpdate(query);
                System.out.println("Resultado de " + query + ":\n\t" + rs);
            } else {
                return userOK;
            }

        } catch (SQLException ex) {
            System.out.println("Erro ao tentar inserir");
            ex.printStackTrace();
        } finally {
            postgres.finalizaConexao();
        }
        return rs;
    }

    private int validarFornecedor(String forn, Statement stm) {
        boolean fornOK = false;
        String validaForn = "SELECT * FROM fornecedor WHERE id_fornecedor = \'" +
                forn + "\'";
        try {
            ResultSet result = stm.executeQuery(validaForn);
            while (result.next()) {
                fornOK = true;
                System.out.println("Fornecedor OK");
                return 0;
            }
            if (!fornOK) {
                System.out.println("Fornecedor NOK");
                return ERROR_FORN_NOT_FOUND;
            }
        } catch (SQLException ex) {
            System.out.println("Erro ao tentar validar Fornecedor");
            ex.printStackTrace();
        }
        return 0;
    }

    private int validarUsuario(String user, Statement stm) {
        boolean userOK = false;
        String validaUser = "SELECT * FROM usuarios WHERE id_usuario = \'" +
                user + "\'";

        try {
            ResultSet result = stm.executeQuery(validaUser);
            while (result.next()) {
                userOK = true;
                System.out.println("Usuario OK");
                return 0;
            }
            if (!userOK) {
                System.out.println("Usuario NOK");
                return ERROR_USER_NOT_FOUND;
            }
        } catch (SQLException ex) {
            System.out.println("Erro ao tentar validar Usuário");
            ex.printStackTrace();
        }
        return 0;
    }

    public int atualizar(String[] person) {
        int rs = 0;
        String user = "1";

        String per = null;
        if (tipoPerson == CLIENTE) {
            per = "Cliente";
        } else {
            per = "Fornecedor";
        }

        String query = "UPDATE " + per + " SET nome = \'" + person[1] + "\'," +
                "tipo_cgc = " + person[2] + ", cgc = \'" + person[3] + "\'," +
                "inscricao_estadual = \'" + person[4] + "\'," +
                "endereco = \'" + person[5] + "\', cep = \'" + person[6] + "\'," +
                "cidade = \'" + person[7] + "\', uf = \'" + person[8] + "\'," +
                "telefone = \'" + person[9] + "\', telefone2 = \'" + person[10] + "\'," +
                "dat_alt = (SELECT current_timestamp)," +
                "id_usuario = " + user +
                " WHERE id_" + per.toLowerCase() + " = "+person[0];

        String validacaoID = "SELECT * FROM " + per + " WHERE id_" + per.toLowerCase() + " = " +
                person[0];

        ConexaoPostgres postgres = new ConexaoPostgres();
        try {
            Connection conexao = postgres.setConexao();
            Statement stm = conexao.createStatement();

            try {
                ResultSet result = stm.executeQuery(validacaoID);
                boolean idValido = false;
                while (result.next()) {
                    idValido = true;
                    break;
                }
                if (!idValido) {
                    System.out.println("Código [" + person[0] + "] não encontrado");
                    return ERROR_ID_NOT_FOUND;
                }
            } catch (SQLException ex) {
                System.out.println("Erro ao tentar validar");
                ex.printStackTrace();
            }

            int userOK = validarUsuario(user, stm);

            if (userOK == 0) {
                rs = stm.executeUpdate(query); //ATUALIZAR
                System.out.println("Resultado de " + query + ":\n\t" + rs);
            } else {
                return userOK;
            }


        } catch (SQLException ex) {
            System.out.println("Erro ao tentar atualizar: " + query);
            ex.printStackTrace();
        } finally {
            postgres.finalizaConexao();
        }
        return rs;
    }

    public String[] localizar(String id_person) {
        String[] person = null;

        String per = null;
        if (tipoPerson == CLIENTE) {
            per = "Cliente";
        } else {
            per = "Fornecedor";
        }

        String validacaoID = "SELECT * FROM " + per + " WHERE id_" + per.toLowerCase() + " = " +
                id_person;

        ConexaoPostgres postgres = new ConexaoPostgres();
        try {
            Connection conexao = postgres.setConexao();
            Statement stm = conexao.createStatement();

            try {
                ResultSet result = stm.executeQuery(validacaoID);
                boolean idValido = false;
                person = new String[11];
                while (result.next()) {
                    idValido = true;
                    person[0] = result.getString("nome");
                    person[1] = result.getString("tipo_cgc");
                    person[2] = result.getString("cgc");
                    person[3] = result.getString("inscricao_estadual");
                    person[4] = result.getString("endereco");
                    person[5] = result.getString("cep");
                    person[6] = result.getString("cidade");
                    person[7] = result.getString("uf");
                    person[8] = result.getString("telefone");
                    person[9] = result.getString("telefone2");
                    person[10] = result.getString("dat_inc");
                    break;
                }
                if (!idValido) {
                    System.out.println("Código [" + id_person + "] não encontrado");
                    return null;
                }
            } catch (SQLException ex) {
                System.out.println("Erro ao tentar validar");
                ex.printStackTrace();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            postgres.finalizaConexao();
        }

        return person;
    }
    private int tipoPerson = 0;
    public static final int ERROR_USER_NOT_FOUND = -1;
    public static final int ERROR_FORN_NOT_FOUND = -2;
    public static final int ERROR_ID_NOT_FOUND = -3;
    public static final int CLIENTE = 1;
    public static final int FORNECEDOR = 2;
    /*
    public static void main(String args[]) {
    //System.out.println("Chamada manual para inserir no banco de dados \"Produto\"");
    //inserir("user", "passwd");
    //atualizar("4", "nomeAtualizado", "");
    }*/
}
